package de.hdu.pms.ctrl;

import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import de.hdu.pms.dao.ArbeitstagDao;
import de.hdu.pms.dao.MitarbeiterDao;
import de.hdu.pms.dao.PausenDao;
import de.hdu.pms.dao.ProjekteDao;
import de.hdu.pms.dao.ProjektzeitDao;
import de.hdu.pms.model.Arbeitstag;
import de.hdu.pms.model.Mitarbeiter;
import de.hdu.pms.model.Pausen;
import de.hdu.pms.model.Projektzeit;

@Controller
public class ArbeitstagController {
	private ArbeitstagDao arbeitstagDao = null;
	private PausenDao pausenDao = null;
	private ProjekteDao projekteDao = null;
	private ProjektzeitDao projektzeitDao = null;
	private MitarbeiterDao mitarbeiterDao = null;
	private Arbeitstag atag = null;
	private Pausen pause = null;
	private Projektzeit projektzeit = null;

	public void setProjektzeitDao(ProjektzeitDao projektzeitDao) {
		this.projektzeitDao = projektzeitDao;
	}

	public void setProjekteDao(ProjekteDao projekteDao) {
		this.projekteDao = projekteDao;
	}

	public void setMitarbeiterDao(MitarbeiterDao mitarbeiterDao) {
		this.mitarbeiterDao = mitarbeiterDao;
	}

	public void setPausenDao(PausenDao pausenDao) {
		this.pausenDao = pausenDao;
	}

	public void setArbeitstagDao(ArbeitstagDao arbeitstagDao) {
		this.arbeitstagDao = arbeitstagDao;
	}

	/***
	 * <p>
	 * Arbeitstag - capturing work day processes
	 * </p>
	 * <p>
	 * Expected HTTP GET and request '/Arbeitstag.html'.
	 * </p>
	 * <p>
	 * Linked Viewname to 'arbeitstag.jsp'
	 * 
	 * @param request
	 * @param action
	 * @param projekt_id
	 * @return
	 */
	@RequestMapping(value = "/Arbeitstag.html", method = RequestMethod.GET)
	public ModelAndView arbeitstag(HttpServletRequest request, String action,
			Integer projekt_id) {
		HttpSession session = request.getSession(true);
		Integer mit_id = Integer.parseInt(session.getAttribute("user")
				.toString());
		Calendar datum = Calendar.getInstance();
		datum.set(Calendar.HOUR_OF_DAY, 0);
		datum.set(Calendar.MINUTE, 0);
		datum.set(Calendar.SECOND, 0);
		Calendar zeit = Calendar.getInstance();
		this.atag = this.arbeitstagDao.findByDate(datum.getTime(), mit_id);
		if (this.atag != null) {
			this.pause = this.pausenDao.findNichtBeendet(this.atag.getId());
		}

		Mitarbeiter mitarbeiter = new Mitarbeiter();
		mitarbeiter = mitarbeiterDao.findById(mit_id);

		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Arbeitstag");
		mv.addObject("message", "Arbeitszeiterfassung");
		if (action != null) {
			switch (action) {
			case "kommen":
				if (this.atag == null) { // double input abfangen
					this.atag = new Arbeitstag();
					this.atag.setAtag_datum(datum.getTime());
					this.atag.setAtag_von(zeit.getTime());
					this.atag.setMitarbeiter(mitarbeiter);
					this.arbeitstagDao.save(this.atag);
				}
				break;
			case "pause_start":
				if (this.pause == null) { // double input abfangen
					this.pause = new Pausen();
					this.pause.setArbeitstag(this.atag);
					this.pause.setPause_start(zeit.getTime());
					this.pausenDao.save(this.pause);
				}
				break;
			case "pause_end":
				if(this.pause != null){ // double input abfangen
					this.pause.setPause_stop(zeit.getTime());
					this.pausenDao.save(this.pause);
					this.pause = null;
				}
				break;
			case "gehen":
				this.projektzeit = this.projektzeitDao.findCheckedIn(this.atag
						.getId());
				if (this.projektzeit != null) { // double input abfangen
					this.projektzeit.setProjekt_bis(zeit.getTime());
					this.projektzeitDao.save(this.projektzeit);
					this.projektzeit = null;
				}
				this.atag.setAtag_bis(zeit.getTime());
				this.arbeitstagDao.save(this.atag);
				this.atag = null;
				break;
			case "kommen2":
				if (this.atag.getAtag_bis() != null) { //: double input abfangen
					this.pause = new Pausen();
					this.pause.setArbeitstag(this.atag);
					this.pause.setPause_start(this.atag.getAtag_bis());
					this.pause.setPause_stop(zeit.getTime());
					this.pausenDao.save(this.pause);
					this.atag.setAtag_bis(null);
					this.arbeitstagDao.save(this.atag);
					this.pause = null;
				}
				break;
			case "checkin":
				this.projektzeit = this.projektzeitDao.findCheckedIn(this.atag.getId());
				if (this.projektzeit == null) { // double input abfangen
					this.projektzeit = new Projektzeit();
					this.projektzeit.setProjekt_von(zeit.getTime());
					this.projektzeit.setArbeitstag(this.atag);
					this.projektzeit.setProjekte(this.projekteDao
							.findById(projekt_id));
					this.projektzeitDao.save(this.projektzeit);
				}
				break;
			case "checkout":
				this.projektzeit = this.projektzeitDao.findCheckedIn(this.atag.getId());
				if (this.projektzeit != null) { // double input abfangen
					this.projektzeit.setProjekt_bis(zeit.getTime());
					this.projektzeitDao.save(this.projektzeit);
				}
				break;
			default:
				break;
			}
		}
		mv.addObject("status", this.getStatus(mit_id));
		mv.addObject("atag", this.atag);
		mv.addObject("pause", this.pause);
		if (this.atag == null) {
			mv.addObject("projekt", "0");
		} else {
			mv.addObject("projekt", this.getProject(this.atag.getId()));
		}
		mv.addObject("projekte", this.projekteDao.findActive());
		mv.setViewName("arbeitstag");
		return mv;
	}
	
	/***
	 *
	 * Function to get current state of the employee
	 * 
	 * @param mit_id
	 * @return
	 */
	public Integer getStatus(Integer mit_id) {
		Integer status = null;

		if (this.atag == null) {
			// Noch nicht am Arbeiten
			status = 0;
		} else if (this.atag.getAtag_bis() == null) {
			// Ist in der Arbeit
			if (this.pause == null) {
				// Am Arbeiten
				status = 1;
			} else {
				// In Pause
				status = 2;
			}
		} else {
			// ist Gegangen
			status = 3;
		}

		return status;
	}

	/***
	 * 
	 * Function to get checked in project name
	 * 
	 * @param atag_id
	 * @return
	 */
	public String getProject(Integer atag_id) {
		String projekt = "0";
		Projektzeit prj = this.projektzeitDao.findCheckedIn(atag_id);
		if (prj != null) {
			projekt = "Projekt eingelogt: "
					+ prj.getProjekte().getProjekt_bez();
		}
		return projekt;
	}
}
